﻿using System.Drawing;

namespace XYAC.Framework.MonitorTireMaterialOnline.DataExporter
{
    /// <summary>
    /// 表示一个点坐标列表，继承自 List&lt;PointF&gt;，提供排序和处理方法。
    /// </summary>
    public class Points : List<PointF>
    {
        /// <summary>
        /// 按X轴升序排序点列表。
        /// </summary>
        public void AscSortForX()
        {
            base.Sort(new AscComparer());
        }

        /// <summary>
        /// 对点的Y值应用移动平均处理。
        /// </summary>
        /// <param name="count">平均窗口大小。</param>
        public void AverageHandle(int count)
        {
            int num;
            PointF tf;
            List<float> vals = new List<float>();

            // 将所有Y值加入列表
            for (num = 0; num < base.Count; num++)
            {
                tf = base[num];
                vals.Add(tf.Y);
            }

            // 对Y值进行移动平均处理
            List<float> list2 = Average.MovingList(vals, count);

            // 将处理后的Y值重新赋值给点
            for (num = 0; num < base.Count; num++)
            {
                tf = base[num];
                base[num] = new PointF(tf.X, list2[num]);
            }
        }

        /// <summary>
        /// 按X轴降序排序点列表。
        /// </summary>
        public void DesSortForX()
        {
            base.Sort(new DesComparer());
        }

        /// <summary>
        /// 对点的Y值应用中值处理。
        /// </summary>
        /// <param name="count">中值窗口大小。</param>
        public void MiddleHandle(int count)
        {
            int num;
            PointF tf;
            List<float> vals = new List<float>();

            // 将所有Y值加入列表
            for (num = 0; num < base.Count; num++)
            {
                tf = base[num];
                vals.Add(tf.Y);
            }

            // 对Y值进行中值处理
            List<float> list2 = Average.MiddleList(vals, count);

            // 将处理后的Y值重新赋值给点
            for (num = 0; num < base.Count; num++)
            {
                tf = base[num];
                base[num] = new PointF(tf.X, list2[num]);
            }
        }

        /// <summary>
        /// 对点的Y值应用移动处理。
        /// </summary>
        /// <param name="count">处理窗口大小。</param>
        public void MovingHandle(int count)
        {
            int num;
            PointF tf;
            List<float> vals = new List<float>();

            // 将所有Y值加入列表
            for (num = 0; num < base.Count; num++)
            {
                tf = base[num];
                vals.Add(tf.Y);
            }

            // 对Y值进行移动处理
            List<float> list2 = Average.MovingList(vals, count);

            // 将处理后的Y值重新赋值给点
            for (num = 0; num < base.Count; num++)
            {
                tf = base[num];
                base[num] = new PointF(tf.X, list2[num]);
            }
        }

        /// <summary>
        /// 实现按X轴升序排序的比较器。
        /// </summary>
        private class AscComparer : IComparer<PointF>
        {
            public int Compare(PointF P1, PointF P2)
            {
                if (P1.X < P2.X)
                {
                    return -1;
                }
                if (P1.X > P2.X)
                {
                    return 1;
                }
                return 0;
            }
        }

        /// <summary>
        /// 实现按X轴降序排序的比较器。
        /// </summary>
        private class DesComparer : IComparer<PointF>
        {
            public int Compare(PointF P1, PointF P2)
            {
                if (P1.X > P2.X)
                {
                    return -1;
                }
                if (P1.X < P2.X)
                {
                    return 1;
                }
                return 0;
            }
        }
    }

}
